# -*- coding: utf-8 -*-
"""
Created on Sat Jul 23 23:40:58 2022

@author: 633
"""

# -*- coding: utf-8 -*-
import numpy as np

"""
Spyder Editor

This is a temporary script file.
"""
from scipy.special import comb

#数据格式----------------------------------------------------------
#W: 整型
#T：浮点
#p：浮点型
#N：整型
#T0：浮点型
#L：整型
#n： 整型
#r：浮点型
#K：list或者array
#type：整型


#def test(w = 6, T = 500, p = 0.2, N = 4, T0 = 24, L = 3, n = 2, r = 5, K = [1,1,1,2,2,5], type = 1):
def test(w, T, p, N, T0, L, n, r, K, type):
     w=w#编队内搭载此部件的装备总数，自定义
     T=T#检修周期，自定义
     p=p#部件更换频率、更换概率，自定义，可定义为同一常数，也可根据每个部件的故障率分别设值
     #N=N#初始备件数量，或叫规定库存量，后续可分别讨论N=2、3、4的情况
     N = int(w*(N+1)/4)
     T0=T0#备件运送时间，自定义

#定数供应............................................................................................
     if type == 1:
          L=L#本次检修时一次性消耗备件数量，根据实际填写
          n=n#本次检修前库存量，根据实际填写
          if L <= n or n >= w:
               #print("备件无需等待")
               print({"code": 1, "msg": "备件无需等待"}, end = "")
          else:
               TMSD = np.zeros(w-n)
               for i in range(n+1,w+1):
                    TMSD[i-n-1] = ((i-n)*T0)/w
               TMSD1=TMSD[L-n-1]#出现备件供应不足情况下，装备平均停机时间
               #print(TMSD1)
               PL=np.zeros(w-n)
               for i in range(n+1,w+1):
                    PL[i-n-1] = cal(w)*pow(p,i)*pow(1-p,w-i)/(cal(i)*cal(w-i))
               #print(PL)
               TMSD_exp1 = 0
               for i in range(w-n):
                    TMSD_exp1 = TMSD_exp1 + TMSD[i]*PL[i]#由备件问题所导致装备平均停机时间的期望
                    TMSD_exp1 = round(TMSD_exp1,4)
               #print(TMSD_exp1)
               #print({"code": 0, "msg": "备件需等待..." + " 出现备件供应不足情况下，装备平均停机时间：" + str(TMSD1) + " 由备件问题所导致装备平均停机时间的期望：" + str(TMSD_exp1), "TMSD1": TMSD1, "TMSD_exp1": TMSD_exp1}, end = "")
               print({"code": 0, "msg": "", "TMSD": TMSD1, "TMSD_exp": TMSD_exp1}, end = "")
#定时供应..............................................................................................................................................................
     elif type == 2:
          r=r#供应间隔期对于检修周期的倍数，根据实际填写
          K=K #供应间隔期内每次检修的备件消耗数，数组元素个数由r决定  
          M = 0
          for i in K:
               M += i #供应间隔期内消耗备件总个数，M可能大于装备数w，但不超过w+N
          #print(M)
          if M <= N:
               #print("备件无需等待")
               print({"code": 1, "msg": "备件无需等待"}, end = "")
          else:
               m=0
               i=0
               while m < N:
                    m=m+K[i]
                    i=i+1

               h=i
               #print(h)#在供应间隔内的第h次检修时消耗完库存
               n1=0
               for i in range(h):
                    n1=n1+K[i]
         
               #print(n1)#截止到第h次检修时，在本次供应间隔内，共消耗n1个备件
               t1=(n1-N)*(r-h)*T
               #print(t1)#以第h次检修为分割，t1表示第h次检修及之前的检修备件在供应周期内延误时间
               t2=0
               for j in range(r-h):
                    t2=t2+(K[h+j]*(r-h-j-1)*T)
         
               #print(t2)  #以第h次检修为分割，t2表示第h次检修之后备件在供应周期内延误时间 
               t3=(M-N)*T0#备件因运输造成的延误时间
               #print(t3)  #由运输造成的延误时间
               TMSD2=(t1+t2+t3)/w#出现备件供应不足情况下，装备平均停机时间
               #print(TMSD2) 
   
               TMSD_exp2=TMSD2*p/N#由备件问题所导致装备平均停机时间的期望
               #print(TMSD_exp2)
               print({"code": 0, "msg": "", "TMSD": TMSD2, "TMSD_exp": TMSD_exp2}, end="")
               #print({"code": 0, "msg": "备件需等待..." + " 在供应间隔内的第h次检修时消耗完库存：" + str(h) + " 截止到第h次检修时，在本次供应间隔内，共消耗n1个备件：" + str(n1) + " 以第h次检修为分割，t1表示第h次检修及之前的检修备件在供应周期内延误时间" + str(t1) + " 以第h次检修为分割，t2表示第h次检修之后备件在供应周期内延误时间：" + str(t2) + " 由运输造成的延误时间：" + str(t3) + " 出现备件供应不足情况下，装备平均停机时间：" + str(TMSD2) + " 由备件问题所导致装备平均停机时间的期望：" + str(TMSD_exp2), "h": h, "n1": n1, "t1": t1, "t2": t2, "t3": t3, "TMSD2": TMSD2, "TMSD_exp2": TMSD_exp2}, end = "")
#即时供应...............................................................................................................................................................
     else:
          L=L#本次检修时一次性消耗备件数量，根据实际填写
          if L <= N or N > w:
               #print("备件无需等待")
               print({"code": 1, "msg": "备件无需等待"}, end = "")
          else:
               TMSD = np.zeros(w - N)
               for i in range(N + 1, w + 1):
                    TMSD[i - N - 1] = ((i - N) * T0) / w
               TMSD3 = TMSD[L - N - 1]  # 出现备件供应不足情况下，装备平均停机时间
               # print(TMSD1)
               PL = np.zeros(w - N)
               for i in range(N + 1, w + 1):
                    PL[i - N - 1] = cal(w) * pow(p, i) * pow(1 - p, w - i) / (cal(i) * cal(w - i))
               # print(PL)
               TMSD_exp3 = 0
               for i in range(w - N):
                    TMSD_exp3 = TMSD_exp3 + TMSD[i] * PL[i]  # 由备件问题所导致装备平均停机时间的期望
                    TMSD_exp3 = round(TMSD_exp3, 4)
               print({"code": 0, "msg": "", "TMSD": TMSD3, "TMSD_exp": TMSD_exp3}, end="")
               #print({"code": 0, "msg": "备件需等待..." + " 由备件问题所导致装备平均停机时间的期望：" + str(TMSD3) + " 由备件问题所导致装备平均停机时间的期望：" + str(TMSD_exp3), "TMSD3": TMSD3, "TMSD_exp3": TMSD_exp3}, end = "")
          
def cal(n):
     if n==0 or n==1:
          return 1
     else:
          return (n*cal(n-1))

if __name__ == "__main__":
     #test(L = 3, n = 4)
     #test(w = 10, T = 500, p = 0.4, N = 3, T0 = 24, L = 5, n = 2, r = 5, K = [1,1,1,2,2], type = 1)
     test(w = {{w}}, T = {{T}}, p = {{p}}, N = {{N}}, T0 = {{T0}}, L = {{L}}, n = {{n}}, r = {{r}}, K = {{K}}, type = {{type}})
     
     #w 装备总数
     #T 检修周期
     #p 部件更换概率
     #N 备件规定库存量N选择和设置
     #T0 备件补充运输时间
     #L 本次检修发现的部件损坏数L/供应间隔期内每次检修的备件损坏数
     #n 定数供应选择后，字段：本次检修前备件库存n,没有的话默认值传2
     #r 定时供应选择后，字段：供应间隔期对于检修周期的倍数r,没有的话默认值传5
     #K 图谱里面保存的字段，是这个部件历史的消耗数
     #type 1-定数供应 2-定时供应 3-即时供应

    